package com.line.myprojectservice.chatserver.handler;

import cn.hutool.core.util.URLUtil;
import com.line.myprojectservice.chatserver.constant.Constants;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.FullHttpRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * @author Line
 */
@Slf4j
@Component
@ChannelHandler.Sharable
public class DispatchHandler extends SimpleChannelInboundHandler<ByteBuf> {

    /**
     * 经过测试，在 ws 的 uri 后面不能传递参数，不然在 netty 实现 websocket 协议握手的时候会出现断开连接的情况。
     * 针对这种情况在 websocketHandler 之前做了一层 地址过滤，然后重写
     * request 的 uri，并传入下一个管道中，基本上解决了这个问题。
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        if (msg instanceof FullHttpRequest) {

            FullHttpRequest request = (FullHttpRequest) msg;

            //中文16进制解码，研究一下编解码器为什么没有起作用
            String uri = URLUtil.decode(request.uri());

            String origin = request.headers().get("Origin");
            if (null == origin) {
                log.info("origin 为空 ");
                ctx.close();
            } else {
                if (null != uri && uri.contains(Constants.DEFAULT_WEB_SOCKET_LINK)) {
                    String[] uriArray = uri.split("/");

                    if (uriArray.length > 3) {
                        if ("Doctor".equals(uriArray[2])) {
                            ctx.pipeline().addLast("Doctor", new DoctorHandler(uriArray[4], uriArray[3]));
                            log.info(" 医生处理器加入最后");

                        } else {
                            ctx.pipeline().addLast("Patient", new PatientHandler(uriArray[4], uriArray[3]));
                            log.info(" 患者处理器处理器加入最后");

                        }
                    } else {
                        ctx.pipeline().addLast("Guider", new GuiderHandler());
                        log.info(" 导游处理器处理器加入最后");

                    }
                    request.setUri(Constants.DEFAULT_WEB_SOCKET_LINK);
                }
            }
        }


        //删除自己这个处理器
        ctx.pipeline().remove("Dispatcher");

        //传递过去让他握手
        ctx.fireChannelRead(msg);

        //自定义事件：@onopen
        ctx.fireUserEventTriggered(Constants.FIRST_SOCKET);

    }

    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) {

    }


}

